package com.gu.listSecurity;

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * @Author: gusongliao
 * @Description: 演示 list 集合线程不安全问题
 * @createDate 2023/05/27 15:29
 */
public class ThreadDemo4 {

    public static void main(String[] args) {


        /**
         * list 线程不安全问题



        // 创建ArrayList 集合   存在线程安全问题
//        List<String> list = new ArrayList();

        // 方案一  创建 Vector 集合 解决线程安全问题
//        List<String> list = new Vector();

        // 方案二  创建 Collections.synchronizedList(new ArrayList<>())
//        List<String> list = Collections.synchronizedList(new ArrayList<>());


        // 方案三 创建 CopyOnWriteArrayList list = new CopyOnWriteArrayList();
        CopyOnWriteArrayList list = new CopyOnWriteArrayList();


        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                // 向集合添加内容
                list.add(UUID.randomUUID().toString().substring(0, 8));

                // 从集合中获取内容，打印即遍历现有内容，并发 读取现有内容
                // 问题关键点，在放入集合的同时取内容，会产生
                // Exception in thread "2" Exception in thread "7" java.util.ConcurrentModificationException
                // 并发修改问题
                System.out.println(list);

            }, String.valueOf(i)).start();
        }

         */

        /**
         * set 线程不安全问题


        // 演示hashset
        // Exception in thread "5" Exception in thread "8" java.util.ConcurrentModificationException
//        Set<String> set = new HashSet<>();


        Set<String> set = new CopyOnWriteArraySet<>();
        for (int i = 0; i < 30; i++) {
            new Thread(() -> {
                // 向集合添加内容
                set.add(UUID.randomUUID().toString().substring(0, 8));

                // 从集合中获取内容，打印即遍历现有内容，并发 读取现有内容
                System.out.println(set);
            }, String.valueOf(i)).start();
        }

         */

        /**
         * map 线程不安全问题
         */

        // 演示hashmap
        // Exception in thread "23" Exception in thread "26" Exception in thread "28" java.util.ConcurrentModificationException
//        Map<String, String> map = new HashMap<>();

        Map<String, String> map = new ConcurrentHashMap<>();
        for (int i = 0; i < 30; i++) {
            String key = String.valueOf(i);
            new Thread(() -> {
                // 向集合添加内容
                map.put(key, UUID.randomUUID().toString().substring(0, 8));

                // 从集合中获取内容，打印即遍历现有内容，并发 读取现有内容
                System.out.println(map);
            }, String.valueOf(i)).start();
        }
    }
}
